package seatiger.tomcat.catalina;

import javax.naming.directory.DirContext;
import javax.servlet.ServletException;
import java.io.IOException;
import java.util.List;

/**
 * 容器接口
 */
public interface Container {

    //添加事件类型
    String ADD_CHILD_EVENT = "addChild";
    String ADD_MAPPER_EVENT = "addMapper";
    String ADD_VALVE_EVENT = "addValve";
    String REMOVE_CHILD_EVENT = "removeChild";
    String REMOVE_MAPPER_EVENT = "removeMapper";
    String REMOVE_VALVE_EVENT = "removeValve";

    void addContainerListener(ContainerListener listener);
    List<ContainerListener> findContainerListeners();
    void removeContainerListener(ContainerListener listener);

    /**
     * 根据传入的request和response 处理逻辑
     * @param request
     * @param response
     * @throws IOException
     * @throws ServletException
     */
    @Deprecated
    void invoke(Request request, Response response)
            throws IOException, ServletException;

    /**
     * 容器名称
     * @return
     */
    String getName();

    /**
     * 指定容器名称
     */
    void setName(String name);

    /**
     * 设置容器的父容器
     * @param container
     */
    void setParent(Container container);

    /**
     * 获取父容器
     * @return
     */
    Container getParent();

    /**
     * 添加子容器
     * @param child
     */
    void addChild(Container child);

    /**
     * 根据名字查找子容器
     * @param name
     * @return
     */
    <T extends Container>  T findChild(String name);

    /**
     * 获取所有子容器
     * @return
     */
    Container[] findChildren();

    /**
     * 移除子容器
     * @param child
     */
    void removeChild(Container child);

    /**
     * 给容器添加Mapper
     * @param mapper
     */
    void addMapper(Mapper mapper);

    /**
     * 根据协议查找一个Mapper
     * @param protocol
     * @return
     */
    @Deprecated
    Mapper findMapper(String protocol);

    /**
     * 获取所有Mapper
     * @return
     */
    @Deprecated
    Mapper[] findMappers();

    /**
     * 删除一个Mapper
     * @param mapper
     */
    @Deprecated
    void removeMapper(Mapper mapper);

    /**
     * 根据request请求，返回一个子容器
     * @param request
     * @param update
     * @return
     */
    @Deprecated
    Container map(Request request, boolean update);

    /**
     * 获取日志记录器
     * @return
     */
    Logger getLogger();

    /**
     * 设置日志记录器
     * @param logger
     */
    void setLogger(Logger logger);

    /**
     * 获取载入器
     * @return
     */
    Loader getLoader();

    /**
     * 设置载入器
     */
    void setLoader(Loader loader);

    /**
     * 获取载入器的父类加载器
     * @return
     */
    ClassLoader getParentClassLoader();

    /**
     * 设置父类加载器
     * @param parent
     */
    void setParentClassLoader(ClassLoader parent);

    /**
     * 获取文件上下文对象
     * @return
     */
    DirContext getResources();

    /**
     * 设置文件上下文对象
     * @param resources
     */
    void setResources(DirContext resources);

    /**
     * 获取session管理器
     * @return
     */
    Manager getManager();

    /**
     * 设置session管理器
     * @param manager
     */
    void setManager(Manager manager);

    /**
     * 获取管道，管道中的阀是排序好的
     * @return
     */
    Pipeline getPipeline();
}
